Object-Oriented Programming
#OOP is a:
programming paradigm
limitation of function pointer
低レベルな話しをすれば、OOP言語機能は関数ポインタの隠蔽に等しい
Uncle Bobの Clean Architecure より
a way for #polymorphism
とくに #subtyping
日本語: オブジェクト指向プログラミング
what is OOP
by Stroustrup
http://www.stroustrup.com/whatis.pdf
https://academic.microsoft.com/paper/1578628194/reference
2.5 Object-Oriented Programming
p. 7
The programming paradigm is:
Decide which classes you want;
provide a full set of operations for each class;
make commonality explicit by using inheritance.
OOP を ad-hoc polymorphism だと捉えているようだ
ソフトウェア危機の当事者は、差分プログラミングをこそ銀の弾丸だと捉えたらしい
メリット
ポリモーフィズムによる Expression Problem へのアプローチには優れてるらしい。
WIP
OOPLとObject-based言語の整理
雑感
polymorphismで言うところの subtyping が勝手についてくるのが邪魔
例えば、 composition や trait しかない言語もある
table:no_inheritance
Go composision
Rust trait
抱き合わせ商法
Smalltalk が目指したのは、システム全体を(高級から低級まで)貫通したデザパタで、今で言う OOUI みたいなもの
すべてが(ミニ)コンピューターである
もっと言えば、遅延実装による(早まった)決定の遅延にこそ妙義があったwint.icon
しかし産業界でこれは難しい…
https://twitter.com/wint7/status/1509762386474938368
@wint7: だからこそ Smalltalk などの“正統な”OOPLは事前の定義を嫌って型なしにしたかったのだと聞く。ただ我々のような平均的な職業プログラマーには、そのような高度な柔軟性は不要だったというだけなのだ…。 https://t.co/wgIpskCkw3
https://twitter.com/wint7/status/1515952121547436033
@wint7: いくら Smalltalk とは言え、リリース後には100%のリカバリーは不可能だと思う(プログラマーごと出荷されない限り…)
逆に最初の定義はあくまで狭義のOOP
通俗的な利点はOOPLというよりOOUIでは?
cf. React や Elm で UI をやるのに OOPL は必要ない
人間のため?
https://twitter.com/tadsan/status/1176707692087394304
@tadsan: オブジェクト指向は機械が実行するために有利な性質はあまりないような気がする(要出典)ので、OOPは文芸的技法
特にアドホック多相
やはりポリモーフィズムを主眼にしたスタイルでは
OOC 2020でも言われた
メンタル・モデルを更に掘りたいwint.icon
cf. アラン・ケイ
いくつかの性質がある
それらの部分集合
家族的類似性
ref.
https://twitter.com/phenan/status/1222468272454422530
@phenan: 単にOOPと言った場合、
* mutable state を使うスタイル
* subtype polymorphism のこと
* カプセル化のこと
* メッセージパッシングのこと
* 実装の継承のこと
* なんか分からんが猫クラスのこと
* 箱
等やこれらの組み合わせを指す場合があるので気を付ける必要がある
https://twitter.com/kawasima/status/1534349411073277952
@kawasima: 度々見かける「オブジェクト指向とは何か?」って議論。
10年以上前に、既に、今さら正確な定義を試みても、みんなを満足させるものは出来ず、何の意味もないので「オブジェクト指向」って用語を捨てよう、ってことが言われてたみたい。
https://t.co/N0nXbKoCwX
https://wiki.c2.com/?DefinitionsOfOoConsideredHarmful
https://twitter.com/phenan/status/1526237431196168198
@phenan: オブジェクト指向と呼ばれるもの、人によって定義が違うが、以下のもののいずれかないし組み合わせであることが多い:
* 情報隠蔽 (カプセル化)
* ポリモーフィズム
* 実装継承
* mutable state
https://twitter.com/phenan/status/1526237433284919296
@phenan: これらのうち実装継承はアンチパターンであることが周知されてきている。
mutable stateは最適化テクニックであり、常用するべきではない。
したがって、多くのケースで有用なのは情報隠蔽とポリモーフィズム。
https://twitter.com/phenan/status/1526237435881201665
@phenan: サブタイプポリモーフィズムは実際の型を隠蔽することで情報隠蔽を実現できる。
したがって、
「現代的なオブジェクト指向とは、サブタイプポリモーフィズムを指す」
として良さそうに思える
状態に着目した定義
「オブジェクト指向とは状態を隠蔽する機構のこと」
→ それに対しては、object-based languageという用語が作られてる
OOPL の subset
特徴
オブジェクトあり
継承・部分型なし
ref.
Object-based language - Wikipedia
An Algebraic Theory of Actors and Its Application to a Simple Object-Based Language | SpringerLink
おおむねpolymorphismとしてのOOPLの補集合と言えそうwint.icon
クラスというモジュール機構に着目した視点
しかし、それならモジュール指向と言えば十分だwint.icon
それにモジュールの方が汎用的な概念だ。
ref.
https://twitter.com/tanakahisateru/status/1528036505159335936
@tanakahisateru: 「クラスに変数と関数がうまく集まっているかどうかを凝集度と言います」
↑
ちがうよ。凝集度はオブジェクト指向よりも広い概念だもん。主にはパッケージとクラスだし、オブジェクト指向でない言語の、同種の関数と型を集めたモジュールにも言えるよね。関数内が構造的に書かれている様子にも言える
https://twitter.com/tanakahisateru/status/1533268037700583424
@tanakahisateru: オブジェクト指向というのは、少なくとも、プログラムの複雑さを閉じて隠蔽し、対外的なシンプルさでもって、ビルディングブロックをモノのように組み立てることなので、詳細コードのひとつひとつに均一なコード品質を求める癖をつけるのは、むしろオブジェクト指向を下手にすると思う
性質一覧
dot notation
polymorphism
protocol
subtyping
inheritence
trait
prototype
implicit module
mutable state
hidden state
cf. F-余代数
Languages #OOPL
Simula (the origin)
ADT系列の祖
プロセスによるシミュがメイン
Smalltalk に影響した
アラン・ケイによって、事後的にOOPLの元祖とされたようだ
ref. https://softwareengineering.stackexchange.com/a/142330/213891
ref.
/mrsekut-p/Simula
Simula - Guide: History, Origin, and More - History Computer
Simula 67
Uncle Bobも世界初のOOPLだと言って。
る
Smalltalk
focusing message passing
actor model?
遅延を意識していたと言う
“What I got from Simula was that you could now replace bindings and assignment with goals. The last thing you wanted any programmer to do is mess with internal state even if presented figuratively. Instead, the objects should be presented as sites of higher level behaviors more appropriate for use as dynamic components.” - Alan Kay, The early history of Smalltalk. In History of programming languages—II, 1993.
「Simulaから得たものは、バインディングと代入をゴールに置き換えることができるということです。プログラマが一番やりたくないことは、たとえ比喩的な表現であっても、内部の状態をいじくり回すことです。その代わりに、オブジェクトは動的なコンポーネントとして使用するのに適した、より高度な動作の現場として提示されるべきである。" - Alan Kay, The early history of Smalltalk. プログラミング言語の歴史-II, 1993.
C++
focusing low-level
memory aware
Java などの系譜に
Slef
focusing #prototype-based
influenced JavaScript somehow
文字通りプロトタイピングを意識してたらしい
Smalltalkへのカウンターだったらしい
io
Self 系列
purest one
LISP
原初の object-based language
Objective-C
C + Object System
OOPL as a subsystem
https://ja.wikipedia.org/wiki/メソッド_(計算機科学)
Smalltalkの特色を色濃く受け継いだObjective-Cでは、メッセージとメソッドを明確に使い分けている。
#要出典
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/DefiningClasses/DefiningClasses.html
https://en.wikipedia.org/wiki/Objective-C
メソッド=メッセージは複合主キーで識別できるセレクターで動的ディスパッチしてるようだwint.icon
厳密には、メソッド=メッセージは無名と言えそうだwint.icon
ref.
guide
オブジェクト指向プログラミング - Wikipedia
歴史
http://www.stroustrup.com/whatis.pdf
https://ubiteku.oinker.me/2016/05/09/what-is-oo-all-about/
https://www.cs.cmu.edu/~charlie/courses/15-214/2014-fall/slides/25-history-oo.pdf
https://twobithistory.org/2019/01/31/simula.html
https://ja.wikipedia.org/wiki/オブジェクト指向プログラミング#歴史
influence graph of oo languages -- this is not meant to be a complete time line. I'm mostly concerned with the root and inner nodes. · GitHub
関連
DDD
DDDの正体は実装パターンとモデリングの組み合わせ - パンダのプログラミングブログ
モデリング
A Brief History of Models and Model Based Systems Engineering and the Case for Relational Orientation | IEEE Journals & Magazine | IEEE Xplore
https://doi.org/10.1109/JSYST.2013.2253034
#Programming_Paradigms